package com.dfzt.myutils.personal;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

public class WeatherParser {

    public List<HourlyWeather> parse48HoursData(String jsonStr) {
        List<HourlyWeather> result = new ArrayList<>(48);

        JSONObject root = JSONObject.parseObject(jsonStr);
        JSONObject hourlyData = root.getJSONObject("result")
                .getJSONObject("hourly");

        // 获取各要素数据集
        JSONArray timeArray = getDataArray(hourlyData, "temperature");
        JSONArray tempArray = getDataArray(hourlyData, "temperature");
        JSONArray cloudArray = getDataArray(hourlyData, "cloudrate");
        JSONArray windArray = getDataArray(hourlyData, "wind");
        JSONArray humiArray = getDataArray(hourlyData, "humidity");
        JSONArray pm25Array = getDataArray(hourlyData, "pm25");

        // 遍历48小时数据
        for (int i = 0; i < 48 && i < timeArray.size();  i++) {
            HourlyWeather item = new HourlyWeather();

            // 基础时间字段
            String isoDateTime = timeArray.getJSONObject(i).getString("datetime");
            item.setDatetime(isoDateTime);

            // 温度处理（带单位校验）
            JSONObject tempObj = tempArray.getJSONObject(i);
            item.setTemperature(tempObj.getDouble("value"));

            // 云量处理（百分比转小数）
            JSONObject cloudObj = cloudArray.getJSONObject(i);
            item.setCloudrate(cloudObj.getDouble("value")  / 100.0);

            // 风速风向处理
            JSONObject windObj = windArray.getJSONObject(i);
            item.setWindSpeed(windObj.getDouble("speed"));
            item.setWindDirection(windObj.getInteger("direction"));

            // 湿度处理
            JSONObject humiObj = humiArray.getJSONObject(i);
            item.setHumidity(humiObj.getDouble("value"));

            // PM2.5处理（带默认值）
            item.setPm25(pm25Array  != null && pm25Array.size()  > i ?
                    pm25Array.getJSONObject(i).getInteger("value")  : -1);

            // 光照强度处理，根据时间datetime推算，夜晚弱，白天强
            item.setLightIntensity(calculateLightIntensity(isoDateTime));

            result.add(item);
        }

        return result;
    }

    private JSONArray getDataArray(JSONObject hourly, String key) {
        JSONArray array = hourly.getJSONArray(key);
        return array != null ? array : new JSONArray();
    }

    // 根据时间和云量估计光照强度
    private int calculateLightIntensity(String isoDateTime) {
        try {
            // 解析ISO时间格式
            LocalDateTime time = LocalDateTime.parse(
                    isoDateTime,
                    DateTimeFormatter.ISO_OFFSET_DATE_TIME
            );
            int hour = time.getHour();

            // 根据时间段划分光照强度
            if (hour >= 21 || hour < 3) {      // 21:00-02:59
                return 200;  // 深夜最低光照
            } else if (hour < 6) {             // 03:00-05:59
                return 500;  // 黎明前微光
            } else if (hour < 9) {             // 06:00-08:59
                return 800;  // 清晨光照增强
            } else if (hour < 15) {            // 09:00-14:59
                return 1000; // 正午最强光照
            } else if (hour < 18) {            // 15:00-17:59
                return 800;  // 下午逐渐减弱
            } else {                           // 18:00-20:59
                return 500;  // 黄昏光线衰减
            }
        } catch (Exception e) {
            System.err.println("时间解析失败: " + isoDateTime);
            return 500; // 默认中性值
        }
    }
}
